#include "f_jeuxreserves.h"
#include "ui_f_jeuxreserves.h"
#include <QtSql/QtSql>
#include <QStandardItem>
#include <QMessageBox>

F_JeuxReserves::F_JeuxReserves(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::F_JeuxReserves)
{
    ui->setupUi(this);

    this->nIDReservationAffiche = 0 ;

    this->ActualiserListe() ;

    this->VerrouillerInterfaceAffichage( true ) ;
    ui->Bt_Modifier->setDisabled( true ) ;
    ui->Bt_Supprimer->setDisabled( true ) ;
    ui->Bt_Valider->hide() ;
    ui->Bt_Annuler->hide() ;
}

F_JeuxReserves::~F_JeuxReserves()
{
    delete ui;
}

void F_JeuxReserves::RechercherParNom( QString sNomJeu )
{
    QSqlQuery RequeteReservations ;

    int i ( 0 ) ;

    //Cr�ation et initialisation du Model
    QStandardItemModel * modele = new QStandardItemModel() ;
    ui->TV_ListeJeu->setModel( modele ) ;
    ui->TV_ListeJeu->setEditTriggers( 0 ) ;

    this->VecteurReservations.clear() ;

    if( sNomJeu == "" )
    {
        RequeteReservations.prepare( "SELECT IdReservation, NomJeu, CodeJeu FROM reservation, Jeux "
                                     "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1" ) ;
    }
    else
    {
        RequeteReservations.prepare( "SELECT IdReservation, NomJeu, CodeJeu FROM reservation, Jeux "
                                     "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1 AND NomJeu LIKE '%" + sNomJeu + "%'" ) ;
    }

    //Exectution de la requ�te
    if( RequeteReservations.exec() )
    {
        /*Cration des caractristiques du tableau : -Nombre de colonnes
                                                      -Nom des colonnes
                                                      -Nombre de lignes*/
        modele->setColumnCount( 2 ) ;
        modele->setRowCount( RequeteReservations.size() ) ;
        modele->setHorizontalHeaderItem( 0, new QStandardItem( "Jeux" ) ) ;
        modele->setHorizontalHeaderItem( 1, new QStandardItem( "Code" ) ) ;

        //Remplissage du tableau avec les informations de la table
        while( RequeteReservations.next() )
        {
            this->VecteurReservations.push_back( RequeteReservations.record().value( 0 ).toInt() );
            modele->setItem( i, 0, new QStandardItem( RequeteReservations.record().value( 1 ).toString() ) ) ;
            modele->setItem( i, 1, new QStandardItem( RequeteReservations.record().value( 2 ).toString() ) ) ;
            i++ ;
        }
        ui->TV_ListeJeu->setColumnWidth( 0, 315 ) ;
        ui->TV_ListeJeu->setColumnWidth( 1, 70 ) ;
    }
    else //Sinon on affiche un message d'erreur
    {
        qDebug() << "F_JeuxReserves::RechercherParNom : RequeteReservations : " << RequeteReservations.lastError().text() ;
    }
}

void F_JeuxReserves::RechercherParCode( QString sCodeJeu )
{
    QSqlQuery RequeteReservations ;

    int i ( 0 ) ;

    //Cr�ation et initialisation du Model
    QStandardItemModel * modele = new QStandardItemModel() ;
    ui->TV_ListeJeu->setModel( modele ) ;
    ui->TV_ListeJeu->setEditTriggers( 0 ) ;

    this->VecteurReservations.clear() ;

    if( sCodeJeu == "" )
    {
        RequeteReservations.prepare( "SELECT IdReservation, NomJeu, CodeJeu FROM reservation, Jeux "
                                     "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1" ) ;
    }
    else
    {
        RequeteReservations.prepare( "SELECT IdReservation, NomJeu, CodeJeu FROM reservation, Jeux "
                                     "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1 AND CodeJeu LIKE '%" + sCodeJeu + "%'" ) ;
    }

    //Exectution de la requ�te
    if( RequeteReservations.exec() )
    {

        /*Cration des caractristiques du tableau : -Nombre de colonnes
                                                      -Nom des colonnes
                                                      -Nombre de lignes*/
        modele->setColumnCount( 2 ) ;
        modele->setRowCount( RequeteReservations.size() ) ;
        modele->setHorizontalHeaderItem( 0, new QStandardItem( "Jeux" ) ) ;
        modele->setHorizontalHeaderItem( 1, new QStandardItem( "Code" ) ) ;


        //Remplissage du tableau avec les informations de la table
        while( RequeteReservations.next() )
        {
            this->VecteurReservations.push_back( RequeteReservations.record().value( 0 ).toInt() );
            modele->setItem( i, 0, new QStandardItem( RequeteReservations.record().value( 1 ).toString() ) ) ;
            modele->setItem( i, 1, new QStandardItem( RequeteReservations.record().value( 2 ).toString() ) ) ;
            i++ ;
        }
        ui->TV_ListeJeu->setColumnWidth( 0, 315 ) ;
        ui->TV_ListeJeu->setColumnWidth( 1, 70 ) ;
    }
    else //Sinon on affiche un message d'erreur
    {
        qDebug() << "F_JeuxReserves::RechercherParCode : RequeteReservations : " << RequeteReservations.lastError().text() ;
    }
}

void F_JeuxReserves::on_LE_NomRecherche_textEdited(const QString &arg1)
{
    ui->LE_CodeRecherche->clear() ;
    this->RechercherParNom( arg1 ) ;
}

void F_JeuxReserves::on_LE_CodeRecherche_textEdited(const QString &arg1)
{
    ui->LE_NomRecherche->clear() ;
    this->RechercherParCode( arg1 ) ;
}

void F_JeuxReserves::ActualiserListe()
{
    if( ui->LE_NomRecherche->text() != "" )
    {
        this->RechercherParNom( ui->LE_NomRecherche->text() ) ;
    }
    else
    {
        this->RechercherParCode( ui->LE_CodeRecherche->text() ) ;
    }
}

void F_JeuxReserves::on_TV_ListeJeu_clicked(const QModelIndex &index)
{
    this->AfficherInfosReservation( this->VecteurReservations.at( index.row() ) ) ;
    ui->Bt_Modifier->setEnabled( true ) ;
    ui->Bt_Supprimer->setEnabled( true ) ;
}

void F_JeuxReserves::AfficherInfosReservation( int nIdReservation )
{
    QSqlQuery RequeteInformations ;
    QSqlQuery RequeteEmprunt ;
    QString sNum ;

    if( nIdReservation != 0 )
    {
        this->nIDReservationAffiche = nIdReservation ;

        RequeteInformations.prepare( "SELECT Nom, Prenom, CodeMembre, Telephone, Mobile, membres.Remarque, NomJeu, CodeJeu, DateReservation, DatePrevuEmprunt, IdJeux "
                                     "FROM reservation, Jeux, membres"
                                     " WHERE Jeux_IdJeux=IdJeux AND Membres_IdMembre=IdMembre AND IdReservation=:IdReservation" ) ;
        RequeteInformations.bindValue( ":IdReservation", nIdReservation ) ;

        if( RequeteInformations.exec() )
        {
            if( RequeteInformations.next() )
            {
                RequeteEmprunt.prepare( "SELECT IdEmprunts FROM emprunts WHERE DateRetour IS NULL AND Jeux_IdJeux=:IdJeux") ;
                RequeteEmprunt.bindValue( ":IdJeux", RequeteInformations.record().value( 10 ).toInt());

                if( RequeteEmprunt.exec() )
                {
                    if( RequeteEmprunt.next() )
                    {
                        ui->LE_Disponibilite->setText( "Emprunté" ) ;
                        ui->LE_Disponibilite->setStyleSheet("color: rgb(255, 0, 0);");
                    }
                    else
                    {
                        ui->LE_Disponibilite->setText( "Pas emprunté" ) ;
                        ui->LE_Disponibilite->setStyleSheet("color: rgb(0, 170, 0);");
                    }
                }
                else
                {
                    qDebug() << "F_JeuxReserves::AfficherInfosReservation : RequeteEmprunt : " << RequeteEmprunt.lastError().text() ;
                }


                ui->LE_NomJeu->setText( RequeteInformations.record().value( 6 ).toString() ) ;
                sNum.setNum( RequeteInformations.record().value( 7 ).toInt() ) ;
                ui->LE_CodeJeu->setText( sNum ) ;


                ui->LE_NomMembre->setText( RequeteInformations.record().value( 0 ).toString() ) ;
                ui->LE_PrenomMembre->setText( RequeteInformations.record().value( 1 ).toString() ) ;
                ui->LE_CodeMembre->setText( RequeteInformations.record().value( 2 ).toString() ) ;
                ui->LE_TelFix->setText( RequeteInformations.record().value( 3 ).toString() ) ;
                ui->LE_Portable->setText( RequeteInformations.record().value( 4 ).toString() ) ;
                ui->PTE_Remarque->setPlainText( RequeteInformations.record().value( 5 ).toString() ) ;


                ui->DE_DateReserv->setDate( RequeteInformations.record().value( 8 ).toDate() ) ;
                ui->DE_DateEmprunt->setDate( RequeteInformations.record().value( 9 ).toDate() ) ;
            }
        }
        else
        {
            qDebug() << "F_JeuxReserves::AfficherInfosReservation : RequeteInformation : " << RequeteInformations.lastError().text() ;
        }
    }
    else
    {
        ui->LE_NomJeu->clear() ;
        ui->LE_CodeJeu->clear() ;
        ui->LE_Disponibilite->clear() ;
        ui->LE_NomMembre->clear() ;
        ui->LE_PrenomMembre->clear() ;
        ui->LE_CodeMembre->clear() ;
        ui->LE_TelFix->clear() ;
        ui->LE_Portable->clear() ;
        ui->PTE_Remarque->clear() ;
        ui->DE_DateEmprunt->clear() ;
        ui->DE_DateReserv->clear() ;
    }

}

void F_JeuxReserves::VerrouillerInterfaceAffichage( bool bVerrouille )
{
    ui->LE_NomJeu->setReadOnly( bVerrouille ) ;
    ui->LE_CodeJeu->setReadOnly( bVerrouille ) ;
    ui->LE_Disponibilite->setReadOnly( bVerrouille ) ;
    ui->LE_NomMembre->setReadOnly( bVerrouille ) ;
    ui->LE_PrenomMembre->setReadOnly( bVerrouille ) ;
    ui->LE_CodeMembre->setReadOnly( bVerrouille ) ;
    ui->LE_Portable->setReadOnly( bVerrouille ) ;
    ui->LE_TelFix->setReadOnly( bVerrouille ) ;
    ui->PTE_Remarque->setReadOnly( bVerrouille ) ;
    ui->DE_DateEmprunt->setReadOnly( bVerrouille ) ;
    ui->DE_DateReserv->setReadOnly( bVerrouille ) ;
}

void F_JeuxReserves::on_Bt_Modifier_clicked()
{
    ui->Bt_Modifier->hide() ;
    ui->Bt_Supprimer->hide() ;
    ui->Bt_Valider->show() ;
    ui->Bt_Annuler->show() ;

    ui->GB_Jeu->setDisabled( true ) ;
    ui->GB_Membre->setDisabled( true ) ;

    ui->DE_DateEmprunt->setReadOnly( false ) ;
    ui->DE_DateReserv->setReadOnly( false ) ;
}

void F_JeuxReserves::on_Bt_Valider_clicked()
{
    QSqlQuery RequeteMaJReservation ;

    ui->Bt_Modifier->show() ;
    ui->Bt_Supprimer->show() ;
    ui->Bt_Valider->hide() ;
    ui->Bt_Annuler->hide() ;

    ui->GB_Jeu->setDisabled( false ) ;
    ui->GB_Membre->setDisabled( false ) ;

    ui->DE_DateEmprunt->setReadOnly( true ) ;
    ui->DE_DateReserv->setReadOnly( true ) ;

    RequeteMaJReservation.prepare( "UPDATE reservation "
                                   "SET DatePrevuEmprunt=:DatePrevuEmprunt,DateReservation=:Datereservation "
                                   "WHERE IdReservation=:IdReservation" ) ;

    RequeteMaJReservation.bindValue( ":DateReservation", ui->DE_DateReserv->date() ) ;
    RequeteMaJReservation.bindValue( ":DatePrevuEmprunt", ui->DE_DateEmprunt->date() ) ;
    RequeteMaJReservation.bindValue( ":IdReservation", this->nIDReservationAffiche ) ;

    if( !RequeteMaJReservation.exec() )
    {
        qDebug() << "F_JeuxReserves::on_Bt_Valider_clicked() : RequeteMaJReservation : " << RequeteMaJReservation.lastError().text() ;
    }

    this->AfficherInfosReservation( this->nIDReservationAffiche ) ;
}

void F_JeuxReserves::on_Bt_Annuler_clicked()
{
    ui->Bt_Modifier->show() ;
    ui->Bt_Supprimer->show() ;
    ui->Bt_Valider->hide() ;
    ui->Bt_Annuler->hide() ;

    ui->GB_Jeu->setDisabled( false ) ;
    ui->GB_Membre->setDisabled( false ) ;

    ui->DE_DateEmprunt->setReadOnly( true ) ;
    ui->DE_DateReserv->setReadOnly( true ) ;

    this->AfficherInfosReservation( this->nIDReservationAffiche ) ;
}

void F_JeuxReserves::on_Bt_Supprimer_clicked()
{
    QSqlQuery RequeteEffacerReservation ;
    if( !QMessageBox::information(this, "Suppression réservation", "Voulez-vous supprimer cette réservation ?", "oui", "non") )
    {
        RequeteEffacerReservation.prepare("DELETE FROM reservation  "
                                          "WHERE IdReservation=:IdReservation") ;
        RequeteEffacerReservation.bindValue( ":IdReservation", this->nIDReservationAffiche ) ;

        if( !RequeteEffacerReservation.exec() )
        {
            qDebug() << "F_JeuxReserves::on_Bt_Supprimer_clicked() : RequeteEffacerReservation : " << RequeteEffacerReservation.lastError().text() ;
        }
    }
    this->ActualiserListe() ;
    this->AfficherInfosReservation( 0 ) ;
}

void F_JeuxReserves::ActualiserReservation()
{
    this->AfficherInfosReservation( this->nIDReservationAffiche ) ;
}

void F_JeuxReserves::on_Bt_Ok_clicked()
{
    QSqlQuery RequeteReservation ;
    RequeteReservation.prepare( "SELECT IdReservation "
                                "FROM reservation, Jeux "
                                "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1 AND CodeJeu=" + ui->LE_CodeRecherche->text() ) ;
    if( RequeteReservation.exec() )
    {
        if( RequeteReservation.next() )
        {
            AfficherInfosReservation(RequeteReservation.record().value( 0 ).toInt() ) ;
        }

    }
    else
    {
        qDebug() << "F_JeuxReserves::on_Bt_Ok_clicked() : RequeteReservation : " << RequeteReservation.lastError().text() ;
    }
}

void F_JeuxReserves::on_LE_CodeRecherche_returnPressed()
{
    QSqlQuery RequeteReservation ;
    RequeteReservation.prepare( "SELECT IdReservation "
                                "FROM reservation, Jeux "
                                "WHERE Jeux_IdJeux=IdJeux AND `JeuEmprunte`=1 AND CodeJeu=" + ui->LE_CodeRecherche->text() ) ;
    if( RequeteReservation.exec() )
    {
        if( RequeteReservation.next() )
        {
            AfficherInfosReservation(RequeteReservation.record().value( 0 ).toInt() ) ;
        }

    }
    else
    {
        qDebug() << "F_JeuxReserves::on_Bt_Ok_clicked() : RequeteReservation : " << RequeteReservation.lastError().text() ;
    }
}
